package com.muyan.netty.biosocket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

/**
 * 传统IO SOCKET客户端
 *
 * @author zzl
 */
public class BIOClient {

    private Socket socket = null;
    private BufferedReader in = null;
    private PrintWriter out = null;

    /**
     * 测试BIO，可以启动多个进行连接测试
     * <p>
     * 也可以使用telnet工具进行测试
     * </p>
     */
    public static void main(String[] args) {
        new BIOClient().connect();
    }

    // 客户端，给服务端发送请求数据
    private static void sendDataToServer(PrintWriter writer, String data) {
        writer.println(data);
    }

    // 对服务端返回的数据，做处理
    // 这可以是一个逻辑，所有从上面的代码抽出来
    // 是的代码，看起来更加的整洁美观
    private static void handleResponse(BufferedReader reader) {
        String response;
        try {
            response = reader.readLine();
            System.out.println("Client接收到Server发来的数据: " + response);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public void connect() {
        try {
            socket = new Socket("127.0.0.1", BIOServer.PORT);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);

            // 客户端向服务端，发送数据
            // 同时接受，服务端响应的信息
            while (true) {
                // 1.接受客户端控制台的输入
                Scanner scanner = new Scanner(System.in);
                String requestInfo = scanner.nextLine();
                //并发送给服务端
                sendDataToServer(out, requestInfo);

                // 2.接受服务端响应的数据，并处理
                // 因为处理，根据不同的业务，处理不同
                // 所以抽离出去,使用handleResponse(String response)函数处理
                // 在这里，只是简单的输出打印
                handleResponse(in);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) in.close();
                if (out != null) out.close();
                if (socket != null) socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


}
